/*
   github.com/go-xorm/xorm
   使用实例

*/

package main

import (
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/go-xorm/xorm"
)

type Product struct {
	Id                 int			// 产品id
	ProductName        string		// 产品名称
	ProductPrice       float32		// 产品价格
	ShopId             int			// 店铺id
	ProductCover       string		// 产品预览图
	ProductDescription string		// 产品简单说明
	ProductStatus      int			// 产品状态
	CreatedAt          int			// 入库时间
	UpdatedAt          int			// 产品信息修改时间
}

// 定义店铺信息结构体
type Shop struct {
	Id                  int			// 店铺id
	ShopName            string		// 店铺名称
	Logo                string		// LOGO
	ShopDescription     string		// 店铺介绍
	LogisticsRate       int			// 物流评分
	ServiceRate         int			// 服务评分
	PromiseRate         int			// 信用评分
	BindId              int			// 绑定的店铺管理者id
	License             string		// 营业执照图片
	LegalPerson         string		// 店铺法人
	LegalPersonIdNumber int64		// 店铺法人身份证号码
	AuthenticationPhoto string		// 举身份证照
	Status              int			// 店铺状态
	CreatedAt           int			// 入驻时间
	UpdatedAt           int			// 店铺信息修改时间
}

var productNormalStatus = 1

func main() {

	// 创建 orm 引擎
	db, err := xorm.NewEngine("mysql", "root:root@tcp(111.230.37.240:3306)/mono?charset=utf8")
	checkErr(err)
	var res Product

	// 获取单条记录
	var resSingle = make(map[string]string, 2)
	has, err := db.Table(&res).Where("product_status = ?", productNormalStatus).Get(&resSingle)
	checkErr(err)
	if has {
		fmt.Println(resSingle)
	}

	// 获取单条记录, interface 方式
	var resList = make([]interface{}, 8)
	has, err = db.Table(&res).Where("product_status = ?", productNormalStatus).Get(&resList)
	checkErr(err)
	if has {
		for k, v := range resList {
			newVal, ok := v.([]byte)   // 类型断言, 能转换 []byte 的进行转换, 因为是字符串
			if ok {
				fmt.Printf(" Key(%v) => Value(%v) \n", k, string(newVal))
			}else{
				fmt.Printf(" Key(%v) => Value(%v) \n", k, v)
			}
		}
	} else {
		fmt.Println("No Row!")
	}

	// 获取多条记录, 结构体 Slice
	var resSlice []Product
	err = db.Where("product_status = ?", productNormalStatus).Limit(10, 0).Find(&resSlice)
	checkErr(err)
	fmt.Println(resSlice)

	// 连表查询
	var resSingle2 []Product
	err = db.Table(&res).Select(`
			product.*
	`).Join("INNER", "shop", "product.shop_id = shop.id").Where("product.product_status = 1").Limit(10,0).Find(&resSingle2)
	checkErr(err)
	fmt.Println(resSingle2)

}

func checkErr(err error) {
	if err != nil {
		panic(err)
	}
}
